As computers have grown into important tools that people use in all aspects of their business and personal lives, there has been an increased demand from computer users to have full use of their computers regardless of location. To enable mobile computer use, computers frequently are equipped for wireless communications so that computer users can access information and services when away from their homes or offices. Though, for these functions to be truly useful, it is desirable for wireless communication to be fast and reliable.
To improve the speed and reliability of wireless communications, error control codes are known. Employing an error control code allows a receiving device to determine whether a packet of information has been received with an error. Errors occur, for example, if noise in the communication channel causes the receiving device to incorrectly classify a received signal as representing a pattern of bits different than the pattern of bits that was sent by a transmitting device.
Depending on the characteristics of the error control code, the receiving device, in addition to simply detecting an error, may also be able to determine the nature of the error and correct for it. Some error control codes can correct for multiple errors, with the number of errors that can be corrected being dependent on characteristics of the code. Though, regardless of the characteristics of the error control code, there is a limit on the number of errors that can be corrected. Accordingly, communication protocols account for the possibility that a packet will be received with more errors than can be corrected or will not be received at all.
Some form of feedback between the receiving device and the transmitting device allows the transmitting device to recognize situations in which a packet was not received, which can trigger another attempt to transmit the packet. When a packet is properly received, the receiving device may send an acknowledgement message, sometimes called an ACK. When more errors than can be corrected occur in a packet, the receiving device may send a reply to the transmitting device, indicating that the packet was not received correctly. Such a reply is sometimes called a negative acknowledgement message, or a NAK.
Though, devices operating according to different protocols may signal receipt of a packet or occurrence of errors in a received packet in different ways. For example, in some protocols, a receiving device may not send any NAK when a packet is received with errors. Rather, it will send an ACK to indicate receipt of a packet with no errors or, when an error correcting code is used, receipt of a packet with a number of errors that could be corrected. The transmitting device will infer, if no ACK is received within a limited time, that a transmitted packet was not properly received.
Regardless of how the transmitting device determines that a packet was not received correctly, the transmitting device may respond to such a determination by retransmitting the packet until it receives an ACK or reaches a limit on the number of transmission attempts set by a protocol used by the device.
The ability to detect and correct for errors in received packets can improve the speed and reliability of communications because it avoids the need to retransmit a packet. Though, there are tradeoffs in selecting a desirable error control code. A stronger error control code that can correct for more errors requires that packets contain more bits to send the same amount of information than would be required to send the same packet using a weaker code that can correct for fewer errors. As a result, though a stronger code reduces the number of instances in which a packet has to be retransmitted, this benefit is offset by the requirement for more bits per packet if a stronger code is used. A designer of a communication system may select a strength of an error control code that balances both the positive and negative impacts on transmission speed to provide, on average, improved performance.
In some instances, a better balance can be achieved using nested error codes. Codes are nested by applying a first error control code to bits to be communicated in a packet. A second code may then be applied to the bits as modified using the first code. Further codes can be applied sequentially in this fashion to provide a desired overall code strength. For example, it is known to first apply a cyclic redundancy check, sometimes called CRC, to bits to be transmitted. The CRC is a value selected so that when the CRC is combined in a mathematical operation with other bits in the packet, a known result occurs. If upon receipt, the known result does not occur when that mathematical operation is performed, it can be inferred that an error occurred such that the bits received do not match the bits transmitted. For example, the CRC may be a value that, when added with words formed by grouping the bits in the packet, produces a sum of zero. If, upon receipt, when the CRC is combined with other bits in the packet, the words do not sum to zero, it can be inferred that an error occurred.
A second error control code may be applied to the bits of the packet with the CRC. Forward error correction, or FEC, is an example of such a code. FEC associates each group of bits in a packet to be transmitted to multiple possible similar bit patterns. Even if errors occur in transmission of the packet that change how the receiving device detects the bits of the packet, it is most likely that the receiver will detect one of the similar bit patterns. If so, the receiver can still associate that bit pattern with the group of bits that was transmitted.